// 1- 创建服务
// 2- 创建接口路由
const path = require("path");
const fs = require("fs");
const express = require("express");
const adminList = require("./modules/Db/collections/adminList");
const advList = require("./modules/Db/collections/advList");
const {sendJson,author} = require("./modules/middleware");
const {getNowTime,getMd5, encode} = require("./modules/utils");
const formidable = require("formidable");
const moment = require("moment");
const app = express()
app.use(express.json());// 接收请求体的数据格式
app.use(sendJson());
// 添加管理员接口
app.post("/adminList",author(),async (req,res)=>{
	
	try{
		// 接收数据
		const {adminName,passWord} = req.body;
		// 判断账号是否有重复的
		const count = await adminList.count({adminName});// 获取满足条件的条数
		if(count===0){
			// 没有重复的,添加
			await adminList.insertOne({
				adminName,
				passWord:getMd5(passWord),
				addTime:getNowTime(),
				lastLoginTime:getNowTime()
			})
			res.sendJson("添加管理员成功",1);
		}else{
			res.sendJson("账号不允许重复");
		}
	}catch (err){
		console.log("adminList->post",err);
		res.sendJson();
	}
	
	
});
// 获取管理员列表
app.get("/adminList",author(),async (req,res)=>{
	try{
		const result = await adminList.find({
			// 按照添加管理员的倒序排列
			sortObj:{
				addTime:-1
			}
		});
		res.json({
			ok:1,
			msg:"成功",
			adminList:result
		})
	}catch (err){
		console.log("get->adminList",err);
		res.sendJson();// {ok:-1,msg:"网络连接错误“}
	}
});
// 根据ID删除管理员信息
app.delete("/adminList/:id",author(),async (req,res)=>{
	try{
		await adminList.deleteOneById(req.params.id);
		res.sendJson("删除成功",1);
	}catch (err){
		console.log("delete->adminList",err);
		res.sendJson();
	}
});
// 登陆
app.post("/login",async (req,res)=>{
	// 伪代码：
	// 1- 接收数据（管理员账号，管理员密码）
	// 2- 根据账号以及密码去数据库中查找是否有匹配的文档
	//    2-1 如果有匹配说明登陆成功
	//    2-2 如果无匹配说明登陆失败（账号或密码说明）
	try{
		// 接收数据（管理员账号，管理员密码）
		const {adminName,passWord} = req.body;
		// 根据账号以及密码去数据库中查找是否有匹配的文档
		const count = await adminList.count({adminName,passWord:getMd5(passWord)});
		if(count === 1) {
			// 更新最后登陆的时间
			await adminList.updateOne({adminName},{lastLoginTime:getNowTime()})
			res.json({
				ok:1,
				msg:"登陆成功",
				token:encode({adminName})
			})
		}
		else res.sendJson("登陆失败");
	}catch (err){
		console.log("post->login",err);
		res.sendJson();
	}
})

// 添加广告
app.post("/advList",(req,res)=>{
	try{
		// 生成年月日类型的地址
		const datePath = moment().format("YYYY/MM/DD");
		// 存放图片的具体目录
		const uploadDir = path.join(__dirname,"/upload",datePath);
		// 判断目录是否存在，如果不存在，那么创建目录
		if(!fs.existsSync(uploadDir)){
			fs.mkdirSync(uploadDir,{recursive:true})
		}
		// 生成IncomingForm实例
		const form = new formidable.IncomingForm({
			// 指定接收图片的目录
			uploadDir,
			keepExtensions:true,// 保留扩展名
		});
		// parse接收二个参数：1- 请求对象  2-回调函数
		// 回调函数接收三个参数：
		// err: 异常信息
		// params:接收的是文件以外的所有数据
		// file:接收的是文件数据
		form.parse(req,async function(err,params,file){
			// let {advType:[advType],advTitle:[advTitle],advOrder:[advOrder],advHref:[advHref]} = params;
			// advType = advType/1;
			// advOrder = advOrder/1;
			
			const advType = params.advType[0]/1;
			const advTitle = params.advTitle[0];
			const advOrder = params.advOrder[0]/1;
			const advHref = params.advHref[0];
			if(file.advPic){
				const advPic = file.advPic[0];
				// 获取后缀名
				const extname = path.extname(advPic.filepath);
				const extArr = [".png",".jpg",".gif"];
				if(extArr.includes(extname.toLowerCase())){
					// console.log(advPic)
					await advList.insertOne({
						advTitle,
						advType,
						advOrder,
						advHref,
						addTime:getNowTime(),
						upTime:getNowTime(),
						advPic:datePath+"/"+advPic.newFilename
					});
					res.json({
						ok:1,
						msg:"添加成功"
					})
				}else{
					fs.unlinkSync(advPic.filepath);
					res.sendJson("请选择正确的图片格式！支持.png,.gif,.jpg")
				}
				
			}else{
				res.sendJson("请选择您要上传的图片！")
			}
			
		})
		
	}catch (err){
		console.log("post->advList",err);
		res.sendJson();
	}
	
})
app.listen(9092,()=>{
	console.log("success");
})